/**
 * @file HoraTrabajoDAO.java
 * @brief 
 * @author Catalina Pelegrin Gonzalez
 * @version 01.00
 */

package GestorClinico;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import GestorUsuarios.Bitacora;
import GestorUsuarios.IDException;
import GestorUsuarios.Usuario;
import Servicios.Conexion;

public class HoraTrabajoDAO {

	private static final String DIA_LUNES = "l";
	private static final String DIA_MARTES = "m";
	private static final String DIA_MIERCOLES = "x";
	private static final String DIA_JUEVES = "j";
	private static final String DIA_VIERNES = "v";
	private static final String DIA_SABADO = "s";
	private static final String DIA_DOMINGO = "d";

	/**
	 * @brief Obtiene las instancias HoraTrabajo asociadas al dia y la hora
	 *        pasadas como argumento. Si hora es nulo devolveria todos los
	 *        objetos del dia.
	 * @param diasemana
	 *            Dia de la semana de la que se quieren obtener las instancias
	 *            HoraTrabajo
	 * @param hora
	 *            Hora de la que se quiere obtener las instancias HoraTrabajo
	 * @return Un vector con los objetos HoraTrabajo obtenidos.
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 * @throws NoSuchAlgorithmException
	 */
	public static HoraTrabajo[] getHoraTrabajo(DiaSemana diasemana, String hora)
			throws SQLException, IOException, ClassNotFoundException,
			IDException, NoSuchAlgorithmException {
		HoraTrabajo[] horatrabaj;
		Conexion.conectar();

		String parte_sel = "WHERE ";
		if (diasemana != null)
			if (diasemana == DiaSemana.LUNES)
				parte_sel += "diaSemana = \'" + DIA_LUNES + "\' AND ";
			else if (diasemana == DiaSemana.MARTES)
				parte_sel += "diaSemana = \'" + DIA_MARTES + "\' AND ";
			else if (diasemana == DiaSemana.MIERCOLES)
				parte_sel += "diaSemana = \'" + DIA_MIERCOLES + "\' AND ";
			else if (diasemana == DiaSemana.JUEVES)
				parte_sel += "diaSemana = \'" + DIA_JUEVES + "\' AND ";
			else if (diasemana == DiaSemana.VIERNES)
				parte_sel += "diaSemana = \'" + DIA_VIERNES + "\' AND ";
			else if (diasemana == DiaSemana.SABADO)
				parte_sel += "diaSemana = \'" + DIA_SABADO + "\' AND ";
			else
				parte_sel += "diaSemana = \'" + DIA_DOMINGO + "\' AND ";
		if (hora != null)
			parte_sel += "horaInicio = \'" + hora + "\' AND ";

		// Sustituimos coma final, por punto y coma
		parte_sel = parte_sel.substring(0, parte_sel.length() - 4) + ";";
		ResultSet tabla = Conexion.consultar("SELECT * FROM HoraTrabajo "
				+ parte_sel);

		ArrayList<HoraTrabajo> list_horatrabajo = new ArrayList<HoraTrabajo>();
		while (tabla.next()) {
			String string_dia = tabla.getString("diaSemana");
			DiaSemana dia;
			if (string_dia.equals(DIA_LUNES))
				dia = DiaSemana.LUNES;
			else if (string_dia.equals(DIA_MARTES))
				dia = DiaSemana.MARTES;
			else if (string_dia.equals(DIA_MIERCOLES))
				dia = DiaSemana.MIERCOLES;
			else if (string_dia.equals(DIA_JUEVES))
				dia = DiaSemana.JUEVES;
			else if (string_dia.equals(DIA_VIERNES))
				dia = DiaSemana.VIERNES;
			else if (string_dia.equals(DIA_SABADO))
				dia = DiaSemana.SABADO;
			else
				dia = DiaSemana.DOMINGO;

			list_horatrabajo.add(new HoraTrabajo(tabla.getInt("idHoraTrabajo"),
					tabla.getString("horaInicio"), dia));
		}

		Conexion.desconectar();
		if (list_horatrabajo.size() > 0) {
			horatrabaj = new HoraTrabajo[list_horatrabajo.size()];
			list_horatrabajo.toArray(horatrabaj);
			return horatrabaj;
		} else
			return null;
	}

        /**
	 * @brief Obtiene todas las instancias HoraTrabajo
	 * @return Un vector con los objetos HoraTrabajo obtenidos.
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 * @throws NoSuchAlgorithmException
	 */
	public static HoraTrabajo[] getHoraTrabajo()
			throws SQLException, IOException, ClassNotFoundException,
			IDException, NoSuchAlgorithmException {
		HoraTrabajo[] horatrabaj;
		Conexion.conectar();



		ResultSet tabla = Conexion.consultar("SELECT * FROM HoraTrabajo;");

		ArrayList<HoraTrabajo> list_horatrabajo = new ArrayList<HoraTrabajo>();
		while (tabla.next()) {
			String string_dia = tabla.getString("diaSemana");
			DiaSemana dia;
			if (string_dia.equals(DIA_LUNES))
				dia = DiaSemana.LUNES;
			else if (string_dia.equals(DIA_MARTES))
				dia = DiaSemana.MARTES;
			else if (string_dia.equals(DIA_MIERCOLES))
				dia = DiaSemana.MIERCOLES;
			else if (string_dia.equals(DIA_JUEVES))
				dia = DiaSemana.JUEVES;
			else if (string_dia.equals(DIA_VIERNES))
				dia = DiaSemana.VIERNES;
			else if (string_dia.equals(DIA_SABADO))
				dia = DiaSemana.SABADO;
			else
				dia = DiaSemana.DOMINGO;

			list_horatrabajo.add(new HoraTrabajo(tabla.getInt("idHoraTrabajo"),
					tabla.getString("horaInicio"), dia));
		}

		Conexion.desconectar();
		if (list_horatrabajo.size() > 0) {
			horatrabaj = new HoraTrabajo[list_horatrabajo.size()];
			list_horatrabajo.toArray(horatrabaj);
			return horatrabaj;
		} else
			return null;
	}

	/**
	 * @brief Obtiene las instancias HoraTrabajo asociadas al id-
	 *        PersonalClinica en el dia indicado. Si dia es nulo devolveria
	 *        todos los objetos HoraTrabajo asociados al id.
	 * @param idpersonalclinica
	 *            Numero identificado del Personal de la Clinica
	 * @param diasemana
	 *            Dia de la Semana
	 * @return Un vector con los objetos HoraTrabajo obtenidos.
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 */
	// FALTA ESTE GET nada mas
	public static HoraTrabajo[] getHorasTrabajoEmpleado(
			Integer idpersonalclinica, DiaSemana diasemana)
			throws SQLException, IOException, ClassNotFoundException,
			NoSuchAlgorithmException {
		HoraTrabajo[] horatrabaj;
		Conexion.conectar();
		String parte_sel = "WHERE ";
		if (diasemana != null)
			if (diasemana == DiaSemana.LUNES)
				parte_sel += "h.diaSemana = \'" + DIA_LUNES + "\' AND ";
			else if (diasemana == DiaSemana.MARTES)
				parte_sel += "h.diaSemana = \'" + DIA_MARTES + "\' AND ";
			else if (diasemana == DiaSemana.MIERCOLES)
				parte_sel += "h.diaSemana = \'" + DIA_MIERCOLES + "\' AND ";
			else if (diasemana == DiaSemana.JUEVES)
				parte_sel += "h.diaSemana = \'" + DIA_JUEVES + "\' AND ";
			else if (diasemana == DiaSemana.VIERNES)
				parte_sel += "h.diaSemana = \'" + DIA_VIERNES + "\' AND ";
			else if (diasemana == DiaSemana.SABADO)
				parte_sel += "h.diaSemana = \'" + DIA_SABADO + "\' AND ";
			else
				parte_sel += "h.diaSemana = \'" + DIA_DOMINGO + "\' AND ";
		if (idpersonalclinica != null)
			parte_sel += "t.idUsuario = " + idpersonalclinica + " AND ";
		parte_sel += "h.idHoraTrabajo=t.idHoraTrabajo ;";

		ResultSet tabla = Conexion
				.consultar("SELECT h.idHoraTrabajo, diaSemana, horaInicio FROM HoraTrabajo h, trabaja t "
						+ parte_sel);

		ArrayList<HoraTrabajo> list_horatrabajo = new ArrayList<HoraTrabajo>();
		while (tabla.next()) {
			String string_dia = tabla.getString("diaSemana");
			DiaSemana dia;
			if (string_dia.equals(DIA_LUNES))
				dia = DiaSemana.LUNES;
			else if (string_dia.equals(DIA_MARTES))
				dia = DiaSemana.MARTES;
			else if (string_dia.equals(DIA_MIERCOLES))
				dia = DiaSemana.MIERCOLES;
			else if (string_dia.equals(DIA_JUEVES))
				dia = DiaSemana.JUEVES;
			else if (string_dia.equals(DIA_VIERNES))
				dia = DiaSemana.VIERNES;
			else if (string_dia.equals(DIA_SABADO))
				dia = DiaSemana.SABADO;
			else
				dia = DiaSemana.DOMINGO;

			list_horatrabajo.add(new HoraTrabajo(tabla.getInt("idHoraTrabajo"),
					tabla.getString("horaInicio"), dia));
		}

		Conexion.desconectar();
		if (list_horatrabajo.size() > 0) {
			horatrabaj = new HoraTrabajo[list_horatrabajo.size()];
			list_horatrabajo.toArray(horatrabaj);
			return horatrabaj;
		} else
			return null;
	}

	/**
	 * @brief Crea la relacion entre el idPersonalClinica y el objeto
	 *        HoraTrabajo pasado como argumento.
	 * @param idPersonalClinica
	 *            Identificado del Personal Clinica
	 * @param h
	 *            HoraTrabajo que se relaciona con PersonalClinica
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 */
	public static void setHoraTrabajoEmpleado(int idPersonalClinica,
			HoraTrabajo[] horas) throws SQLException, IOException,
			ClassNotFoundException, IDException {
		if (horas != null) {
			Conexion.conectar();
			for (HoraTrabajo h : horas) {
				Conexion
						.actualizar("INSERT trabaja(idUsuario,idHoraTrabajo) VALUES (\'"
								+ idPersonalClinica
								+ "\',"
								+ h.getIdHoraTrabajo() + ");");
			}
			Conexion.desconectar();
		}
	}

	/**
	 * @brief Elimina las horas de trabajo del empleado
	 * @param idPersonalClinica
	 *            Identificado del Personal Clinica
	 * @param h
	 *            HoraTrabajo que se relaciona con PersonalClinica
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 */
	public static void eliminaHorasTrabajo(int idPersonalClinica)
			throws SQLException, IOException, ClassNotFoundException,
			IDException {
		Conexion.conectar();
		Conexion.actualizar("DELETE FROM trabaja WHERE idUsuario=\'"
				+ idPersonalClinica + "\';");
		Conexion.desconectar();
	}

	/**
	 * @brief Obtiene los id de miembros del personal de la clinica asociados al
	 *        dia y la hora indicados como parametro.
	 * @param dia
	 *            Dia de la semana
	 * @param hora
	 *            Hora
	 * @return Un vector con los id de los miembros del personal de la clinica
	 *         obtenidos.
	 * @throws ClassNotFoundException
	 *             , IOException, SQLException, IDException
	 */
	public static Integer[] getEmpleadosHoraTrabajo(DiaSemana diasemana,
			String hora) throws SQLException, IOException,
			ClassNotFoundException {
		Integer[] idspersonal;
		Conexion.conectar();

		String parte_sel = "WHERE ";
		if (diasemana != null)
			if (diasemana == DiaSemana.LUNES)
				parte_sel += "diaSemana = \'" + DIA_LUNES + "\' AND ";
			else if (diasemana == DiaSemana.MARTES)
				parte_sel += "diaSemana = \'" + DIA_MARTES + "\' AND ";
			else if (diasemana == DiaSemana.MIERCOLES)
				parte_sel += "diaSemana = \'" + DIA_MIERCOLES + "\' AND ";
			else if (diasemana == DiaSemana.JUEVES)
				parte_sel += "diaSemana = \'" + DIA_JUEVES + "\' AND ";
			else if (diasemana == DiaSemana.VIERNES)
				parte_sel += "diaSemana = \'" + DIA_VIERNES + "\' AND ";
			else if (diasemana == DiaSemana.SABADO)
				parte_sel += "diaSemana = \'" + DIA_SABADO + "\' AND ";
			else
				parte_sel += "diaSemana = \'" + DIA_DOMINGO + "\' AND ";
		if (hora != null)
			parte_sel += "horaInicio = \'" + hora + "\' AND ";
		parte_sel += "h.idHoraTrabajo=t.idHoraTrabajo ;";

		ResultSet tabla = Conexion
				.consultar("SELECT idUsuario FROM trabaja t, HoraTrabajo h "
						+ parte_sel);

		ArrayList<Integer> list_idperson = new ArrayList<Integer>();
		while (tabla.next()) {
			list_idperson.add(tabla.getInt("idUsuario"));
		}
		Conexion.desconectar();
		if (list_idperson.size() > 0) {
			idspersonal = new Integer[list_idperson.size()];
			list_idperson.toArray(idspersonal);
			return idspersonal;
		} else
			return null;

	}

}
